#include <signal.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <pthread.h>
#include <stdlib.h>

#include "utils.h"
#include "ReceptionInfosProxy.h"
#include "ReceptionInfosApache.h"
#include "TraitementInfosBd.h"
#include "TraitementRegles.h"
#include "EnvoiInfosProxy.h"

#define DROITS 0660
#define REFERENCE "key.txt"
#define REFERENCE2 "key2.txt"

int main(int argc, char **argv)
{
	int balTraitementInfos, balMessagesProxy;
	key_t semKey;
	pthread_t threadReceptionInfosProxy, threadTraitementInfosBd, threadTraitementRegles, threadEnvoiInfosProxy, threadReceptionInfosApache;



	//Creation des boites aux lettres
	semKey=ftok(REFERENCE,1);
	balTraitementInfos = msgget(semKey,IPC_CREAT | DROITS);
	printf("[main] BaL %i créée.\n", balTraitementInfos);
	semKey=ftok(REFERENCE2,1);
	balMessagesProxy = msgget(semKey,IPC_CREAT | DROITS);
	printf("[main] BaL %i créée.\n", balMessagesProxy);
	
	
	pthread_create(&threadReceptionInfosProxy,NULL,&(ReceptionInfosProxy),balTraitementInfos);
	pthread_create(&threadTraitementInfosBd,NULL,&(TraitementInfosBd),balTraitementInfos);
	pthread_create(&threadReceptionInfosApache,NULL,&(ReceptionInfosApache),balMessagesProxy);
	pthread_create(&threadTraitementRegles,NULL,&(TraitementRegles),balMessagesProxy);
	pthread_create(&threadEnvoiInfosProxy,NULL,&(EnvoiInfosProxy),balMessagesProxy);

    printf ("Tapez sur Entrée pour fermer le thread\n");
    scanf("%*c");


    //On demande le kill des threads et on attend leur fin
    pthread_cancel(threadReceptionInfosProxy);
	pthread_join(threadReceptionInfosProxy,NULL);

	pthread_cancel(threadReceptionInfosApache);
	pthread_join(threadReceptionInfosApache,NULL);

	pthread_cancel(threadTraitementInfosBd);
	pthread_join(threadTraitementInfosBd,NULL);

	/*pthread_cancel(threadTraitementRegles);
	pthread_join(threadTraitementRegles,NULL);*/

	pthread_cancel(threadEnvoiInfosProxy);
	pthread_join(threadEnvoiInfosProxy,NULL);

	//destruction des BAL
	msgctl(balTraitementInfos,IPC_RMID,0);
	msgctl(balMessagesProxy,IPC_RMID,0);
	printf("[main] Fin du main\n");
	return 0;
}
